NLBのターゲットにALBを登録する構成で、HTTPからHTTPSへのリダイレクトをさせる
いわさです。
半年ほど前のアップデートで、NLB(Network Load Balancer)のターゲットにALB(Application Load Balancer)を指定することが出来るようになりました。
上記ブログ内でも解説されていますが、それまではALBのIPアドレスを静的にしたい場合にGlobal Acceleratorを使うか、NLBを前段に置いた上でLambdaで定期的にALBの動的なIPアドレスを監視する必要がありました。
アップデートによって、細かいこと気にせずにALBの前段にNLBを配置出来るようになったのですが、TLS/SSLをロードバランサーでオフロードする際は少し注意が必要です。
NLBのTLSリスナーは使えない
先程のアップデートブログにも留意事項として記載されていますが、NLBのTLSリスナーを使った際は、ALBのターゲットグループを転送先に選択することは出来ません。
NLBのTLSリスナーはALBのターゲットグループに転送できません
NLBのTLSリスナーを使うと、以下のようにNLBでTLSを終端させることが出来ますが、NLB-ALB-hogeの構成の場合はそれが出来ないということです。
NLBターゲットグループのポートとALBのリスナーポートが一致している必要がある
上記に記載されているのですが、NLBが転送するターゲットグループのポートはALBのリスナーとして登録されているポートと一致している必要があります。
For Listeners, you can create an HTTP or HTTPS listener on any port. However, you must ensure that the port number of this listener matches the port of the target group in which this Application Load Balancer will reside.
TCPリスナーを80と443でそれぞれ用意し、ALBで終端させる
そこで、今回はNLBにTCP80ポートのターゲットグループと、TCP443ポートのターゲットグループをNLBのリスナーからの転送先とし、ALBではHTTP/HTTPSのリスナーを用意する形としました。
ALBのHTTPリスナーはHTTPSへのリダイレクトを行い、HTTPSリスナーはバックエンド(ここではASG内のEC2インスタンス)へ転送するようにしています。
CloudFormationでテンプレートを用意しました。
設定が少し冗長だったので、大部分は割愛しますが、ターゲットにALBを設定するターゲットグループの設定テンプレートがまだ見当たらなかったのでそこだけ抜粋します。
TargetType
にalb
を指定します。
それ以外はEC2登録時と同じで、IDにALBを指定してターゲットのAZは省略します。
NetworkLoadBalancerTargetGroup80: DependsOn: - ApplicationListenerHTTP Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: !Sub ${AWS::StackName}-nlb80-tg VpcId: !Ref VPC Port: 80 Protocol: TCP HealthCheckPort: traffic-port HealthCheckProtocol: HTTP HealthCheckPath: "/index.html" TargetType: alb Targets: - Id: !Ref ApplicationLoadBalancer Port: 80
Route53ホストゾーンへは、非エイリアスレコードでNLBのIPアドレス用にAレコードを作成しています。
動作確認してみると、期待どおりHTTPリスナーではリダイレクトされ、HTTPSリスナーではバックエンドに転送されていますね。
$ curl -I http://0508nlb.tak1wa.com HTTP/1.1 301 Moved Permanently Server: awselb/2.0 Date: Sun, 08 May 2022 08:39:13 GMT Content-Type: text/html Content-Length: 134 Connection: keep-alive Location: https://0508nlb.tak1wa.com:443/ $ curl -I https://0508nlb.tak1wa.com HTTP/2 200 date: Sun, 08 May 2022 08:39:18 GMT content-type: text/html; charset=UTF-8 content-length: 5 server: Apache/2.4.53 () last-modified: Sun, 08 May 2022 07:24:41 GMT etag: "5-5de7afc236596" accept-ranges: bytes
さいごに
本日はNLBのターゲットにALBを登録した状態でのHTTP/HTTPSリスナーでリダイレクトをさせてみました。
ドキュメントを見て、2本用意すればいけそうかなと思ったのですが動作確認まで出来ました。
TLSリスナーが使えなかったり、ターゲットグループをそれぞれ用意しなければいけない感じですが、やはり以前のようにLambdaでIPアドレスを追跡したりはしなくて済むので良いですね。